在密碼學的發展史中,RSA 是第一個同時能用於「數據加密」與「數位簽章」的非對稱加密演算法。今天我們將從 RSA 的數學基礎切入,分析其潛在的安全弱點,並透過 picoCTF / CyLab 平台上的 Mini RSA 題目,示範如何利用 Python 自動化腳本攻破配置不當的小公鑰指數(Small Exponent Attack)。
RSA 的安全性建立在大整數的質因數分解困難度上(Factoring Problem)。其運作流程如下:
當公鑰指數選擇過小(例如 e = 3),且明文 M 的長度較短或未添加足夠強度的隨機填充(Padding,如 OAEP)時:
如果 M^e < N,則在加密過程中根本沒有發生模數溢位(Modulo Operation):
C = M^e
此時只要直接對密文 C 開 e 次方根即可還原明文:
M = 💡(C 的 e 次方根)
如果 M^e 稍微超過 N(即溢位了 k 次),其關係式可表示為:
C = M^e - k × N => M^e = C + k × N
只要爆破小範圍的整數 k(k = 0, 1, 2, ...),並檢查 C + k × N 是否能精準開 e 次整數方根,就能輕鬆求得明文 M。
values 檔案,內容包含巨大的 $N$、小公鑰指數 $e = 3$ 以及密文 $C$。solve_minirsa.py)為了處理超大整數的高精度計算,我們使用 Python 的 gmpy2 模組中的 iroot 函數,配合 pycryptodome 將整數轉換回明文字串。
import gmpy2
from Crypto.Util.number import long_to_bytes
import urllib.request
# 1. 下載題目提供的數值檔案
url = "[https://challenge-files.cylabacademy.net/library/e5f3ed71ca30832720bfbed988000b07159531af4efd8bde534455cb31281df7/values](https://challenge-files.cylabacademy.net/library/e5f3ed71ca30832720bfbed988000b07159531af4efd8bde534455cb31281df7/values)"
print("[*] 正在下載 values 檔案...")
urllib.request.urlretrieve(url, "values.txt")
# 2. 解析檔案內容 (相容各類欄位格式)
data = {}
with open("values.txt", "r") as f:
for line in f:
line = line.strip()
if ":" in line:
key, val = line.split(":", 1)
data[key.strip().lower()] = int(val.strip())
N = data['n']
e = data['e']
c = data['ciphertext (c)']
print(f"[*] 解析成功!N 長度: {N.bit_length()} bits, e: {e}")
print("[*] 開始嘗試 Small Exponent (e=3) 開幾次方根爆破...")
# 3. 爆破 k 值並進行整數開三次方根
found = False
for k in range(100000):
val = c + k * N
root, is_exact = gmpy2.iroot(val, e)
if is_exact:
flag_bytes = long_to_bytes(int(root))
print(f"\n[+] 成功找到整數次方根!k = {k}")
print(f"[🎯] 解密結果 (Flag): {flag_bytes.decode('utf-8', errors='ignore')}\n")
found = True
break
if not found:
print("[-] 未在範圍內找到結果。")

在 WSL (Ubuntu) 環境下執行:
python3 solve_minirsa.py
輸出畫面:
[*] 正在下載 values 檔案...
[*] 解析成功!N 長度: 3340 bits, e: 3
[*] 開始嘗試 Small Exponent (e=3) 開幾次方根爆破...
[+] 成功找到整數次方根!k = 0
[🎯] 解密結果 (Flag): academy{e_sh0u1d_b3_lArg3r_35f26e1a}
Flag: academy{e_sh0u1d_b3_lArg3r_35f26e1a}